using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using twistmachinev2.OPCUA;

namespace twistmachinev2.TwistControl
{
    /// <summary>
    /// 支持数据绑定的Button控件
    /// 继承自DevExpress SimpleButton，添加PropertyName属性用于记录关联的Node信息
    /// 支持根据boolean节点值自动变化颜色：true显示现代绿色，false显示现代红色
    /// </summary>
    public class DataBindingButton : SimpleButton
    {
        #region 私有字段
        private string _propertyName;
        private DynamicDataModel _dataModel;
        private bool _isUpdating = false;
        private Timer _updateTimer;
        
        // 现代化颜色定义
        private static readonly Color ModernGreenColor = Color.FromArgb(76, 175, 80);  // Material Design Green
        private static readonly Color ModernRedColor = Color.FromArgb(244, 67, 54);    // Material Design Red
        private static readonly Color DefaultBackColor = Color.FromArgb(240, 240, 240); // 默认背景色
        #endregion

        #region 公共属性
        /// <summary>
        /// 关联的数据模型
        /// </summary>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public DynamicDataModel DataModel
        {
            get { return _dataModel; }
            set
            {
                if (_dataModel != value)
                {
                    // 取消旧模型的事件订阅
                    if (_dataModel != null)
                    {
                        _dataModel.PropertyChanged -= OnDataModelPropertyChanged;
                    }

                    _dataModel = value;

                    // 订阅新模型的事件
                    if (_dataModel != null)
                    {
                        _dataModel.PropertyChanged += OnDataModelPropertyChanged;
                    }

                    // 立即更新显示
                    UpdateAppearance();
                }
            }
        }

        /// <summary>
        /// 关联的Node属性名称
        /// 用于记录此按钮关联的是哪一个Node信息，便于在点击事件中进行相应操作
        /// </summary>
        [Category("Data Binding")]
        [Description("要关联的Node属性名称，点击右侧按钮可从OPC UA节点中选择")]
        [Editor(typeof(PropertyNameEditor), typeof(UITypeEditor))]
        public string PropertyName
        {
            get { return _propertyName; }
            set
            {
                if (_propertyName != value)
                {
                    _propertyName = value;
                    UpdateAppearance();
                    OnPropertyChanged(nameof(PropertyName));
                }
            }
        }

        /// <summary>
        /// 是否启用自动更新（定时刷新显示）
        /// </summary>
        [Category("Data Binding")]
        [Description("是否启用定时自动更新显示")]
        [DefaultValue(false)]
        public bool AutoUpdate { get; set; } = false;

        /// <summary>
        /// 自动更新间隔（毫秒）
        /// </summary>
        [Category("Data Binding")]
        [Description("自动更新间隔，单位毫秒")]
        [DefaultValue(1000)]
        public int UpdateInterval { get; set; } = 1000;
        #endregion

        #region 构造函数
        /// <summary>
        /// 初始化DataBindingButton控件
        /// </summary>
        public DataBindingButton()
        {
            // 设置默认属性
            this.Text = "按钮";
            // DevExpress控件使用Appearance属性设置背景色
            this.Appearance.BackColor = DefaultBackColor;
            
            // 初始化更新定时器
            _updateTimer = new Timer();
            _updateTimer.Tick += UpdateTimer_Tick;
        }
        #endregion

        #region 事件处理
        /// <summary>
        /// 属性变更事件
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            // 可以在这里添加属性变更的处理逻辑
            // 例如：触发PropertyChanged事件等
        }

        /// <summary>
        /// 数据模型属性变化事件处理
        /// </summary>
        private void OnDataModelPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            // 只有当变化的属性是我们关注的属性时才更新
            if (e.PropertyName == _propertyName || string.IsNullOrEmpty(e.PropertyName))
            {
                System.Diagnostics.Debug.WriteLine($"DataBindingButton属性变化: {_propertyName}, 新值: {_dataModel?.GetValue(_propertyName)}");
                
                if (InvokeRequired)
                {
                    Invoke(new Action(UpdateAppearance));
                }
                else
                {
                    UpdateAppearance();
                }
            }
        }

        /// <summary>
        /// 自动更新定时器事件
        /// </summary>
        private void UpdateTimer_Tick(object sender, EventArgs e)
        {
            UpdateAppearance();
        }
        #endregion

        #region 公共方法
        /// <summary>
        /// 获取关联的Node属性名称
        /// 在按钮点击事件中可以调用此方法获取关联的Node信息
        /// </summary>
        /// <returns>关联的Node属性名称</returns>
        public string GetAssociatedNodeProperty()
        {
            return _propertyName;
        }

        /// <summary>
        /// 检查是否已设置关联的Node属性
        /// </summary>
        /// <returns>如果已设置PropertyName则返回true，否则返回false</returns>
        public bool HasAssociatedNode()
        {
            return !string.IsNullOrEmpty(_propertyName);
        }

        /// <summary>
        /// 手动更新外观
        /// </summary>
        public void RefreshAppearance()
        {
            UpdateAppearance();
        }

        /// <summary>
        /// 设置数据绑定
        /// </summary>
        /// <param name="dataModel">数据模型</param>
        /// <param name="propertyName">属性名称</param>
        public void SetDataBinding(DynamicDataModel dataModel, string propertyName)
        {
            PropertyName = propertyName;
            DataModel = dataModel; // 最后设置，触发更新
        }

        /// <summary>
        /// 启动自动更新
        /// </summary>
        public void StartAutoUpdate()
        {
            if (AutoUpdate && UpdateInterval > 0)
            {
                _updateTimer.Interval = UpdateInterval;
                _updateTimer.Start();
            }
        }

        /// <summary>
        /// 停止自动更新
        /// </summary>
        public void StopAutoUpdate()
        {
            _updateTimer.Stop();
        }
        #endregion

        #region 私有方法
        /// <summary>
        /// 更新按钮外观
        /// </summary>
        private void UpdateAppearance()
        {
            if (_isUpdating) return;

            try
            {
                _isUpdating = true;

                if (_dataModel == null || string.IsNullOrEmpty(_propertyName))
                {
                    // 没有数据绑定时使用默认颜色 - DevExpress控件使用Appearance属性
                    this.Appearance.BackColor = DefaultBackColor;
                    System.Diagnostics.Debug.WriteLine($"DataBindingButton无数据绑定，使用默认颜色: {this.Name}");
                    return;
                }

                var value = _dataModel.GetValue(_propertyName);
                UpdateColorByValue(value);
            }
            catch (Exception ex)
            {
                // 发生异常时使用默认颜色 - DevExpress控件使用Appearance属性
                this.Appearance.BackColor = DefaultBackColor;
                System.Diagnostics.Debug.WriteLine($"DataBindingButton更新外观失败: {ex.Message}");
            }
            finally
            {
                _isUpdating = false;
            }
        }

        /// <summary>
        /// 根据值更新颜色
        /// </summary>
        /// <param name="value">节点值</param>
        private void UpdateColorByValue(object value)
        {
            if (value == null)
            {
                // DevExpress控件使用Appearance属性设置背景色
                this.Appearance.BackColor = DefaultBackColor;
                return;
            }

            // 尝试转换为boolean
            bool boolValue = false;
            if (value is bool)
            {
                boolValue = (bool)value;
            }
            else if (bool.TryParse(value.ToString(), out bool parsedValue))
            {
                boolValue = parsedValue;
            }
            else
            {
                // 无法转换为boolean时使用默认颜色
                this.Appearance.BackColor = DefaultBackColor;
                return;
            }

            // 根据boolean值设置现代化颜色 - 使用DevExpress的Appearance属性
            this.Appearance.BackColor = boolValue ? ModernGreenColor : ModernRedColor;
        }
        #endregion

        #region 重写方法
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            
            // 控件创建后启动自动更新
            if (AutoUpdate)
            {
                StartAutoUpdate();
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                // 清理资源
                StopAutoUpdate();
                _updateTimer?.Dispose();
                
                if (_dataModel != null)
                {
                    _dataModel.PropertyChanged -= OnDataModelPropertyChanged;
                }
            }
            base.Dispose(disposing);
        }
        #endregion

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.ResumeLayout(false);

        }
    }
}